package cn.lili.modules.promotion.entity.dos;

import cn.hutool.core.bean.BeanUtil;
import cn.lili.common.enums.PromotionTypeEnum;
import cn.lili.modules.goods.entity.dos.GoodsSku;
import cn.lili.modules.promotion.entity.dto.KanjiaActivityGoodsDTO;
import cn.lili.modules.promotion.entity.enums.PromotionsScopeTypeEnum;
import cn.lili.mybatis.BaseEntity;
import com.baomidou.mybatisplus.annotation.TableName;
import com.fasterxml.jackson.annotation.JsonFormat;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import lombok.EqualsAndHashCode;
import lombok.NoArgsConstructor;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;

import java.util.Date;

/**
 * 促销活动商品实体类
 *
 * @author Chopper
 * @since 2020-03-19 10:44 上午
 */
@EqualsAndHashCode(callSuper = true)
@Data
@TableName("li_promotion_goods")
@ApiModel(value = "促销商品")
@NoArgsConstructor
public class PromotionGoods extends BaseEntity {

	private static final long serialVersionUID = 4150737500248136108L;

	@ApiModelProperty(value = "商家ID")
	private String storeId;

	@ApiModelProperty(value = "商家名称")
	private String storeName;

	@ApiModelProperty(value = "商品id")
	private String goodsId;

	@ApiModelProperty(value = "商品SkuId")
	private String skuId;

	@ApiModelProperty(value = "商品名称")
	private String goodsName;

	@ApiModelProperty(value = "缩略图")
	private String thumbnail;

	@ApiModelProperty(value = "活动开始时间")
	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
	@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis")
	private Date startTime;

	@ApiModelProperty(value = "活动结束时间")
	@JsonFormat(timezone = "GMT+8", pattern = "yyyy-MM-dd HH:mm:ss")
	@Field(type = FieldType.Date, format = DateFormat.custom, pattern = "yyyy-MM-dd HH:mm:ss || yyyy-MM-dd || yyyy/MM/dd HH:mm:ss|| yyyy/MM/dd ||epoch_millis")
	private Date endTime;

	@ApiModelProperty(value = "活动id")
	private String promotionId;

	/**
	 * @see PromotionTypeEnum
	 */
	@ApiModelProperty(value = "促销工具类型")
	private String promotionType;

	/**
	 * @see cn.lili.modules.goods.entity.enums.GoodsTypeEnum
	 */
	@ApiModelProperty(value = "商品类型")
	private String goodsType;

	@ApiModelProperty(value = "活动标题")
	private String title;

	@ApiModelProperty(value = "卖出的商品数量")
	private Integer num;

	@ApiModelProperty(value = "原价")
	private Double originalPrice;

	@ApiModelProperty(value = "促销价格")
	private Double price;

	@ApiModelProperty(value = "兑换积分")
	private Long points;

	@ApiModelProperty(value = "限购数量")
	private Integer limitNum;

	@ApiModelProperty(value = "促销库存")
	private Integer quantity;

	@ApiModelProperty(value = "分类path")
	private String categoryPath;

	/**
	 * @see PromotionsScopeTypeEnum
	 */
	@ApiModelProperty(value = "关联范围类型")
	private String scopeType = PromotionsScopeTypeEnum.PORTION_GOODS.name();

	@ApiModelProperty(value = "范围关联的id")
	private String scopeId;

	public PromotionGoods(GoodsSku sku) {
		if (sku != null) {
			BeanUtil.copyProperties(sku, this, "id", "price");
			this.skuId = sku.getId();
			this.originalPrice = sku.getPrice();
		}
	}

	public PromotionGoods(PointsGoods pointsGoods, GoodsSku sku) {
		if (pointsGoods != null) {
			BeanUtil.copyProperties(sku, this, "id");
			BeanUtil.copyProperties(pointsGoods, this, "id");
			this.promotionId = pointsGoods.getId();
			this.quantity = pointsGoods.getActiveStock();
			this.originalPrice = sku.getPrice();
			this.promotionType = PromotionTypeEnum.POINTS_GOODS.name();
			this.scopeId = sku.getId();
		}
	}

	public PromotionGoods(KanjiaActivityGoodsDTO kanjiaActivityGoodsDTO) {
		if (kanjiaActivityGoodsDTO != null) {
			BeanUtil.copyProperties(kanjiaActivityGoodsDTO, this, "id");
			BeanUtil.copyProperties(kanjiaActivityGoodsDTO.getGoodsSku(), this, "id");
			this.setQuantity(kanjiaActivityGoodsDTO.getStock());
			this.setPromotionId(kanjiaActivityGoodsDTO.getId());
			this.setPromotionType(PromotionTypeEnum.KANJIA.name());
			this.setTitle(PromotionTypeEnum.KANJIA.name() + "-" + kanjiaActivityGoodsDTO.getGoodsName());
			this.setScopeType(PromotionsScopeTypeEnum.PORTION_GOODS.name());
			this.setPromotionType(PromotionTypeEnum.KANJIA.name());
		}
	}
}